/***
 * @Description: 本文件主要是关于回环网络接口的设置及其相关功能的实现的C语言文件
 * @Author: Liverpool
 * @Date: 2024-04-26 01:42:42
 * @LastEditTime: 2024-04-26 01:43:00
 * @LastEditors: Liverpool
 */
#include "loopback.h"

// 定义网络接口的相关硬件操作
/***
 * @description: （内部静态函数）回环网络接口的打开
 * @Author: Liverpool
 * @Date: 2024-04-28 00:27:58
 * @return {*} 打开网卡过程中的错误
 * @param {_Net_Interface} *netif 需要打开的网卡内存地址
 * @param {void} *data 进行操作的数据
 */
static net_err_t loopback_open(struct _Net_Interface *netif, void *data)
{
    netif->type = NET_Interface_LOOP;
    return NET_ERR_OK;
}
/***
 * @description: （内部静态函数）回环网络接口的关闭
 * @Author: Liverpool
 * @Date: 2024-04-28 00:27:58
 * @return {*} 关闭网卡过程中的错误
 * @param {_Net_Interface} *netif 需要关闭的网卡内存地址
 */
static void loopback_close(struct _Net_Interface *netif)
{
}
/***
 * @description: （内部静态函数）回环网络接口的数据传输
 * @Author: Liverpool
 * @Date: 2024-04-28 00:27:58
 * @return {*} 传输数据中网卡出现的错误
 * @param {_Net_Interface} *netif 需要进行传输的网卡内存地址
 */
static net_err_t loopback_transmit(struct _Net_Interface *netif)
{
    D_Packet *packet = net_interface_get_out(netif, -1); // 得到输出队列的发送数据包
    if (packet)
    {
        net_err_t err = net_interface_put_in(netif, packet, -1); // 在网卡的输入队列中直接写入
        if (err < 0)
        {
            packet_free(packet);
            return err;
        }
    }
    return NET_ERR_OK;
}
static const D_Net_Interface_operation loopback_opreation = {
    .open = loopback_open,
    .close = loopback_close,
    .transmit = loopback_transmit,
};
/***
 * @description: 回环网络接口初始化
 * @Author: Liverpool
 * @Date: 2024-04-26 01:44:41
 * @return {*} 在初始化过程中的错误
 */
net_err_t loopback_init(void)
{
    debug_info(Debug_NetInterface, "init loopback");
    D_Net_Interface *netif = net_interface_open("loopback", &loopback_opreation, (void *)0);
    if (!netif)
    {
        debug_error(Debug_NetInterface, "open loopback error");
        return NET_ERR_NONE;
    }
    // 设置回环网络接口的IP地址
    D_IP_ADDR ip, mask;
    ipaddr_from_str(&ip, "127.0.0.1");
    ipaddr_from_str(&mask, "255.0.0.0");
    net_interface_set_addr(netif, &ip, &mask, (D_IP_ADDR *)0); //  设置回环接口的IP地址
    net_interface_set_active(netif);                           // 激活网络接口
    debug_info(Debug_NetInterface, "loopback init done...");
    return NET_ERR_OK;
}